package com.mq.java.test;

import com.mq.common.Object2ByteArrayUtils;
import com.rabbitmq.client.*;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zhanghaidong
 * @version v1.0
 * @description
 * @date 2019/8/16
 */
public class ProducerFanout {

    /**
     * 创建RabbitMQ队列的参数(Arguments)说明:
     *
     * x-message-ttl 发送到队列的消息在丢弃之前可以存活多长时间（毫秒）。
     * x-expires 队列在被自动删除（毫秒）之前可以使用多长时间。
     * x-max-length 队列在开始从头部删除之前可以包含多少就绪消息。
     * x-max-length-bytes 队列在开始从头部删除之前可以包含的就绪消息的总体大小。
     * x-dead-letter-exchange 设置队列溢出行为。这决定了在达到队列的最大长度时消息会发生什么。有效值为drop-head或reject-publish。交换的可选名称，如果消息被拒绝或过期，将重新发布这些名称。
     * x-dead-letter-routing-key 可选的替换路由密钥，用于在消息以字母为单位时使用。如果未设置，将使用消息的原始路由密钥。
     * x-max-priority 队列支持的最大优先级数;如果未设置，队列将不支持消息优先级。
     * x-queue-mode 将队列设置为延迟模式，在磁盘上保留尽可能多的消息以减少内存使用;如果未设置，队列将保留内存缓存以尽快传递消息。
     *  x-queue-master-locator 将队列设置为主位置模式，确定在节点集群上声明时队列主机所在的规则。
     *
     * @param args
     */
    public static void main(String[] args) {

        try{
            ConnectionFactory connectionFactory = new ConnectionFactory();

            connectionFactory.setUsername("zhanghaidong");
            connectionFactory.setPassword("mqzhd123");
            connectionFactory.setVirtualHost("/");
            connectionFactory.setHost("127.0.0.1");
            connectionFactory.setPort(5672);
            Connection connection = connectionFactory.newConnection("fanout测试");

            Channel channel = connection.createChannel();

            channel.exchangeDeclare("fanout-exchange",
                    BuiltinExchangeType.FANOUT,
                    false,
                    false,
                    false,
                    null);

            channel.queueDeclare("fanout-queue", false, false, false, null);

            channel.queueBind("fanout-queue", "fanout-exchange", "fanout-routingKey", null);

            // 将Channel设置为Confirm模式
            // channel.confirmSelect();
            for (int i = 0; i < 100 ; i++) {
                Map<String, Object> map = new HashMap<>(2);
                map.put("name", "张三" + i);
                map.put("age", 1 + i);
                channel.basicPublish("fanout-exchange",
                        "fanout-routingKey",
                        false,
                        false,
                        MessageProperties.MINIMAL_BASIC,
                        Object2ByteArrayUtils.objToByteArr(map));
            }
            channel.close();
            connection.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
